/**
 * 题目:
 * 实现一个javaScript函数，该函数可以将一个URL中的查询参数解析为一个对象
 * 
 * 描述:
 * 对于URL: http://www.example.com/?name=张&age=18，该函数应该返回 {name:张,age:18}
*/


const URL = 'http://www.example.com/?name=张&age=18'

/**
 * 方法1
 * @param {String} url 
 * @return {Object} 查询参数对象
*/
function getQueryObj1(url) {
  if (!url) throw new Error('url不存在')
  const [_, queryString] = url.split('?')
  if(!queryString) throw new Error('url无查询参数')
  
  return queryString.split('&').reduce((acc, cur) => {
    const [key, value] = cur.split('=')
    if(!acc[key]) acc[key] = value
    return acc
  }, {})
} 

// 测试
getQueryObj1(URL)
// { "name": "张", "age": "18" }



/**
 * 方法2
 * @param {String} url 
 * @return {Object} 查询参数对象
*/
function getQueryObj2(url) {
  const obj = {}
  // 正则表达式[?&]+([^=&]+)=([^&]*)的意思是：
  // [?&]+: 匹配一个或多个问号或者和符号。
  // ([^=&]+): 匹配一次或多次不是等于号和和符号的字符（即参数名）。
  // =: 匹配等于号。
  // ([^&]*): 匹配零次或多次不是和符号的字符（即参数值）。
  url.replace(/[\?\&]([^=]+)=([^&])/g, function(str, $1, $2) {
    obj[$1] = $2
  })
  return obj
} 

// 测试
getQueryObj2(URL)
// { "name": "张", "age": "18" }
